package com.mq.service;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;

import com.mq.vo.QaAuditReqVO;

/**
 *   定义一个交换器名称：主题模式交换器
 * 
 * @author Administrator
 *
 */
@Configuration
@Service
public class MQExchangeTopicService {
	
	@Autowired
	RabbitTemplate rabbitTemplate;
	
	//定义一个交换器名称
	public static final String EX_NAME="my-exchange-topic";
	//定义一个交换器名称绑定的消息队列名称1
	public static final String EX_NAME_MQ_NAME_1="my-exchange-topic-mq-1";
	//定义一个交换器名称绑定的消息队列名称2
	public static final String EX_NAME_MQ_NAME_2="my-exchange-topic-mq-2";

	/**
	  *    发送消息到交换器中，然后交换器分发到绑定这个交换器的队列
	 * @param qaAuditReqVO
	 */
	public void send(QaAuditReqVO qaAuditReqVO) {
		//发送mq到一个交换器中，第一个参数是交换机名称，第二参数是路由器名称
		//发送后，只能由这个绑定的路由的队列才能接收到信息
		rabbitTemplate.convertAndSend(EX_NAME,qaAuditReqVO.getNo(), qaAuditReqVO);
	}


	/**
	  * 创建第一消息端监听器，绑定一个主题交换机以及路由，这个路由可以支持主题交换器，支持占位符消息
	  * 如果下面的交换器名称，路由名称不存在，系统在启动的时候会自动创建
	 * @param qaAuditReqVO
	 */
	@RabbitListener(bindings = {
			 @QueueBinding(key = "#.error",//定义了一个路由器,以.error错误后缀的路由，都会进入到这个消息队列模式
					 	   value =@Queue(name = EX_NAME_MQ_NAME_1),//指定队列名称
			               exchange =@Exchange(name = EX_NAME,type = ExchangeTypes.TOPIC))//指定交换器名称且是一个主题交换器
	})
	public void receive1(QaAuditReqVO qaAuditReqVO) {
		System.out.println(EX_NAME_MQ_NAME_1+"<====接收到简单消息："+qaAuditReqVO.getNo());
	}
	
	/**
	  * 创建第二消息端监听器，绑定一个主题交换机以及路由，这个路由可以支持主题交换器，支持占位符消息
	  * 如果下面的交换器名称，路由名称不存在，系统在启动的时候会自动创建
	 * @param qaAuditReqVO
	 */
	@RabbitListener(bindings = {
			 @QueueBinding(key = "#.log",//定义了一个路由器,以.error错误后缀的路由，都会进入到这个消息队列模式
					 	   value =@Queue(name = EX_NAME_MQ_NAME_2),//指定队列名称
			               exchange =@Exchange(name = EX_NAME,type = ExchangeTypes.TOPIC))//指定交换器名称且是一个主题交换器
	})
	public void receive2(QaAuditReqVO qaAuditReqVO) {
		System.out.println(EX_NAME_MQ_NAME_2+"<====接收到简单消息2："+qaAuditReqVO.getNo());
	}
	

}
